package aventuraespacial;

import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.Shape;
import java.awt.geom.AffineTransform;
import java.awt.geom.Ellipse2D;
import java.util.ArrayList;


/**
 * @author    woodoo
 */
public class Nave extends ObjetoEspacial{
	
	
	/******************************* CONSTANTES DE LA CLASE *****************************/
	static final int NORTE=0;
	static final int SUR=1;
	static final int ESTE=2;
	static final int OESTE=3;
	
	static final int ANGULO_NORTE =-90;
	static final int ANGULO_SUR =-270;
	static final int ANGULO_OESTE =-180;
	static final int ANGULO_ESTE =0;
	static final int ANGULO_NORESTE =-45;
	static final int ANGULO_NOROESTE =-135;
	static final int ANGULO_SUROESTE =-225;
	static final int ANGULO_SURESTE =-315;	
	
	
	static final int ANCHONAVE=50;		
	
	static final int ALTONAVE=50;	
	
	static final String NOMBRE_NAVE= "nave.png";
	
	
	private double velocidasX;	
	
	
	private double velocidadY;  
	    
    
    private int vidas;
	
	
	private int salud;
	
	
	private int saludMaxima;    
    
    
    private ArrayList<Bala> listaBalas; 
    
    
    private Bala modeloBala;
    
    
    private Bala modeloBalaEspecial;
    
    protected boolean direcciones[];
    
    
    private int cantPoderesEspeciales;
    
    private boolean inmunidad;
    
    private boolean escudo;
    
    
    private Image imagenNave;


	


	/******************************* CONSTRUCTOR DE NAVE *********************************/
    
    public Nave (double x, double y, double velocidad, double angulo){    	
    	this.setVivo(true);
        this.setAngulo(angulo);
        this.setX(x);
        this.setY(y);
        this.setVelocidad(velocidad);
        this.setVivo(true);
        this.setVidas(3);
        this.setSalud(100);
        this.setSaludMaxima(salud);        
        this.setModeloBala(new BalaFuego(1,1,EspacioExterior.VELOCIDAD_BALA_DEFAULT, ANGULO_NORTE));
        this.setModeloBalaEspecial(new BalaBarredora(1,1,EspacioExterior.VELOCIDAD_BALA_DEFAULT,ANGULO_NORTE));
        this.listaBalas = new ArrayList<Bala>();
        this.setForma(new Rectangle(ANCHONAVE,ALTONAVE));        
        this.setVelocidadY(0); 
        this.setVelocidasX(0);
        this.cantPoderesEspeciales= 0;
        this.inmunidad=false;
        this.escudo=false;
        this.modeloBala= new BalaFuego( x,  y, 3, EspacioExterior.ANGULO_NORTE);
        this.direcciones= new boolean[4];
        for (int i =0;i<4;i++){
        	direcciones[i]=false;
        }
        
        this.imagenNave = cargarImagen(NOMBRE_NAVE);
        
    }
    /************************** GETTER SETTER*************************************	 */
       
    public int getSalud() {
        return salud;
    }
    
       
    public int getSaludMaxima() {
        return saludMaxima;
    } 
        
    public int getVidas() {
        return vidas;
    }
        
    public ArrayList<Bala> getListaBalas() {
        return listaBalas;
    }
        
    public Bala getModeloBala() {
        return modeloBala;
    }
    
	public double getVelocidasX() {
		return velocidasX;
	}
	
	public double getVelocidadY() {
		return velocidadY;
	}
	
	public static int getAnchonave() {
		return ANCHONAVE;
	}
	
	public static int getAltonave() {
		return ALTONAVE;
	}
	
	public void setVelocidasX(double velocidasX) {
		this.velocidasX = velocidasX;
	}
	
	public void setVelocidadY(double velocidadY) {
		this.velocidadY = velocidadY;
	}
	
	public void setSalud(int salud) {
        this.salud = salud;
    }
	
	public void setSaludMaxima(int saludMaxima) {
        this.saludMaxima = saludMaxima;
    }
    
	public void setVidas(int vidas) {
        this.vidas = vidas;
    }
	
	public void setModeloBala(Bala modeloBala) {
        this.modeloBala = modeloBala;
    }
	
	public int getCantPoderesEspeciales() {
		return cantPoderesEspeciales;
	}
	
	public boolean hasInmunidad(){
		return this.inmunidad;
	}
	
	
	public boolean  hasEscudo(){
		return this.escudo;
	}
	
	public Image getImagenNave() {
		return imagenNave;
	}
	
	/***************************** METODOS DE CLASE ***************************************/
	
    public void disparar(){
    	/**LA IDEA ES QUE SE CREE UNA COPIA DE LA BALA QUE TENGA COMO MODELO
    	UNA VEZ QUE TIENE LA COPIA LA VA A GUARDAR EN LA LISTA DE BALAS CORRESPONDIENTES
    	PERO QUE PASA SI EL TIPO DE BALA SON POR EJEMPLO 3 BALAS. X ESO NECESITO QUE  
    	LA BALA SE AUTO GUARDE Y NO QUE LA NAVE LA GUARDE, XQ LA NAVE NO SABE COMO SE 
    	COMPORTA EL TIPO DE BALA, PERO LA BALA SI VA A SABER COMO SE COMPORTA.
    	**/
    	Bala balaAux = this.modeloBala.identidad();
    	
    	//aca tengo q modificarle los x e y y velocidad de la bala
    	balaAux.setX(this.getX());
    	balaAux.setY(this.getY()-(ALTONAVE/2));
    	//la velocidada y angulo esta desde antes establecida en identidad, yo solo 
    	//la traslado
    	balaAux.guardarseEnNave(this);    	
    	   	
    }
        
    public int cantBalas(){
		return listaBalas.size();
	}
	
    public double calcularAngulo(){
    	
    	if(direcciones[NORTE]){
    		if ( !direcciones[SUR]&& !direcciones[ESTE] && !direcciones[OESTE]) return ANGULO_NORTE;
    		else if (direcciones[ESTE]) return ANGULO_NORESTE;
    		else if (direcciones[OESTE]) return ANGULO_NOROESTE;
    	}else if(direcciones[SUR]){
    		if ( !direcciones[ESTE] && !direcciones[OESTE]) return ANGULO_SUR;
    		else if (direcciones[ESTE]) return ANGULO_SURESTE;
    		else if (direcciones[OESTE]) return ANGULO_SUROESTE;
    	}else if (direcciones[OESTE]) return ANGULO_OESTE;
    		else if (direcciones[ESTE]) return ANGULO_ESTE;
    		
    	return 0;
    }
    
    public boolean estaEnMovimiento(){    	
    	return (direcciones[NORTE] || direcciones[SUR] || direcciones[ESTE] || direcciones[OESTE]);
    }
    
    
    protected void agregarBala(Bala bala){
    	listaBalas.add(bala);
    }
    
    public void incCantPoderesEspeciales() {
		this.cantPoderesEspeciales += 1;
	}
    
    public void dispararPoderEspecial(){
    	if(cantPoderesEspeciales>0){
    		Bala balaAux = this.modeloBalaEspecial.identidad();       	
        	
        	balaAux.setX(EspacioExterior.ANCHO_PANTALLA/2);
        	balaAux.setY(this.getY()-(ALTONAVE/2));
        	
        	balaAux.guardarseEnNave(this);    	
    		cantPoderesEspeciales--;
    	}
    }
    
    public void moverOringen(){
    	this.x=EspacioExterior.ANCHO_PANTALLA/2;
    	this.y=EspacioExterior.ALTO_PANTALLA-(EspacioExterior.ALTO_PANTALLA/4);
    }
	
    public void setInmune(boolean bool){
    	this.inmunidad=bool;
    }
    
    
    
    
    public void setEscudo(boolean bool){
    	this.escudo=bool;
    }
    
    public Shape getBordeEscudo() {
    	
    	return new Ellipse2D.Double(this.getX()-(ANCHONAVE/1.3),this.getY()-(ANCHONAVE/1.4),ANCHONAVE+(ANCHONAVE/2),ANCHONAVE+(ANCHONAVE/2));
    }
    
    /***************************** IMPLEMENTACION DE METODOS ***********************************/
    
	@Override
	public Rectangle getBordes() {
		int mitadAncho= (int) (ANCHONAVE/2 );
		int mitadAlto=(int) (ALTONAVE/2) ;
		return new Rectangle((int)this.getX()-mitadAncho,(int)this.getY()-mitadAlto,ANCHONAVE,ALTONAVE);
		
	}
	
	
	
	@Override
	public boolean fueraDePantalla() {
		//NO SIRVE
		return false;
	}
	
	
	
	@Override
    public double calcDirX(){
		return (double) (Math.cos(calcularAngulo()*Math.PI/180));
	}
    @Override
    public double calcDirY(){
		return (double) (Math.sin(calcularAngulo()*Math.PI/180));
	}
	
    
	public void setModeloBalaEspecial(Bala modeloBalaEspecial) {
		this.modeloBalaEspecial = modeloBalaEspecial;
	}
	
	public Bala getModeloBalaEspecial() {
		return modeloBalaEspecial;
	} 
	
	@Override
	public void dibujar(Graphics2D g2d){
		//DIBUJO LA NAVE EN EL DOBLE BUFFER 
		AffineTransform identidad= new AffineTransform();
		AffineTransform trans= new AffineTransform();
		g2d.setTransform(identidad); 	
    	
    	trans.setTransform(identidad);
    	trans.translate(x-(ANCHONAVE/2), y-(ALTONAVE/2));
    	//LA IMAGEN ES DE 32X32 , ES POR ESO QUE DIVIDE A 32
    	trans.scale((float)ANCHONAVE/32,(float)ALTONAVE/32);
    	g2d.drawImage(this.imagenNave,trans,null);
    	
		
		//DIBUJO EL CONTORNO PARA LAS COLISIONES
    	if(ObjetoEspacial.isBordesActivados()){
			g2d.setTransform(identidad);
			g2d.setColor(Color.WHITE);
			g2d.draw(getBordes());
		}
		//DIBUJO EL CONTORNO DEL ESCUDO
		if (hasEscudo()){
			g2d.setTransform(identidad);
			g2d.setColor(Color.WHITE);
			g2d.draw(getBordeEscudo());
		}
		
		
		
	}
	
	
}

	